/***********************************************************************************
 @file   
 @author
 @attention
 ***********************************************************************************/
#include "device_wt588.h"
/***********************************************************************************
@param   static const 
***********************************************************************************/
uint8_t cmd_move_alarm[4]    = {0xF3, 0x02, 0xF3, 0x02}; // 移动报警语音
uint8_t cmd_normal_alarm[2]  = {0x00, 0xF2};             // 普通报警语音
uint8_t cmd_special_alarm[2] = {0x03, 0xF2};             // 特殊报警语音
uint8_t cmd_low_power[1]     = {0x01};                   // 低电量语音
uint8_t cmd_stop[4]          = {0};                      // 

static  uint16_t wt588_timer_cnt;
/***********************************************************************************
 * @brief 开关
 ***********************************************************************************/
void wt588_switch(uint8_t on_off)
{
    if(on_off){
        alarm_en(1);
    }
    else{
        alarm_en(0);
    }
}
/***********************************************************************************
 * @brief  系统us延时
***********************************************************************************/
void delay_us(__IO uint32_t us)
{
    us*=4;
    while (us != 0)
    {
        us--;
    }
}
/***********************************************************************************
 * @brief 语音芯片发送字节
 ***********************************************************************************/
void wt588_send_byte(uint8_t data)
{
    uint8_t i;
 
    __disable_irq(); 
 
    WT588_CLK_SET();
    delay_ms(4);
    WT588_CLK_RESET();
    delay_ms(5);
    for(i=0;i<8;i++)
    {
        WT588_CLK_RESET();
        if((data>>i)&0X01)
        {
            WT588_DAT_SET();
        }
        else
        {
            WT588_DAT_RESET();
        }
        delay_us(300);
        WT588_CLK_SET();
        delay_us(300);
    }
    WT588_CLK_RESET();
    WT588_DAT_RESET();
    __enable_irq();  // 重新开启中断    
}

/***********************************************************************************
 * @brief 语音芯片发送协议
 * @param onoff 芯片开关控制 
 *              - 1: 开启芯片并发送数据
 *              - 0: 关闭芯片
 ***********************************************************************************/
void wt588_send_data(uint8_t *data,uint8_t len,uint8_t onoff)
{
    static uint8_t wt588_on=0;//管理芯片是否需要开启

    if(onoff)
    {
        if(wt588_on==0)
        {
            wt588_switch(1);
            wt588_on=1;
            delay_ms(200);
        }
        for(uint8_t i=0;i<len;i++)
        {
            wt588_send_byte(data[i]);
        }
    }
    else
    {
        wt588_switch(0);
        wt588_on=0;
    }    
}
/***********************************************************************************
* @brief  语音流程 
***********************************************************************************/
void wt588_process(void)
{
    static uint8_t goto_low1,goto_low2,go_alarm, status_alarm;
    //---------------------移动警报只响一次
    if(adxl345.global_alarm==1)
    {
        adxl345.global_alarm = 0;
        if(wt588_timer_cnt==0)
        {
            wt588_send_data(cmd_move_alarm,sizeof(cmd_move_alarm),1);
            printf("adxl345 MOVE ALARM\r\n"); 
            /*移动警告触发，15s播报完成后进入睡眠*/
            wt588_timer_cnt = 1500;
            sleep_device_operation_time(wt588_timer_cnt);
        }
    }
    //---------------------浓度警报 1-3分钟可调
    if((status==1)||(status==2)||(status==6))
    {
        if(wt588_timer_cnt==0&&go_alarm == 0)//浓度报警只进入一次，恢复状态重置
        {
            go_alarm = 1;
            if(system_data.speak){
                wt588_send_data(cmd_special_alarm,sizeof(cmd_special_alarm),1);
            }
            else{
                wt588_send_data(cmd_normal_alarm,sizeof(cmd_normal_alarm),1);
            }
            
            if((status==1)||(status==2)){
                wt588_timer_cnt = system_data.speak_times*100;
                sleep_device_operation_time(wt588_timer_cnt);        
            }
            else{
                wt588_timer_cnt=1000;
            }
            status_alarm = 1;
        }
    }
    else
    {
        if(status_alarm==1)//如果是浓度警告或者测试，在取消测试或者浓度正常时警告取消
        {
            status_alarm = 0;
            wt588_timer_cnt = 0;
        }
        go_alarm = 0;
    }
    //---------------------电量警告1    
    if(power_low1||dis_lowpower)
    {
        if((goto_low1==0)&&(wt588_timer_cnt==0)||dis_lowpower)
        {
            dis_lowpower=0;
            goto_low1=1;
            wt588_send_data(cmd_low_power,sizeof(cmd_low_power),1);  
            wt588_timer_cnt = 760;
            sleep_device_operation_time(wt588_timer_cnt);   
        }
    } 
    //---------------------电量警告2
    if(power_low2)
    {
        if((goto_low2==0)&&(wt588_timer_cnt==0))
        {
            wt588_timer_cnt=760;
            goto_low2=1;
            wt588_send_data(cmd_low_power,sizeof(cmd_low_power),1);
            wt588_timer_cnt = 760;
            sleep_device_operation_time(wt588_timer_cnt);            
        }
    }
    //---------------------消音及计时停止
    if(xiaoyin||wt588_timer_cnt==0)//只有低报和高报消音才使能
    {
        wt588_send_data(cmd_stop,sizeof(cmd_stop),0);
    } 
}



/***********************************************************************************
 * @brief  wt588睡眠进入
***********************************************************************************/
void wt588_goto_sleep(void)	
{
    wt588_timer_cnt = 0;
    adxl345.global_alarm = 0;
    wt588_send_data(cmd_stop,sizeof(cmd_stop),0);
}    
/***********************************************************************************
 * @brief  报警 定时器 RTC IT
***********************************************************************************/
void wt588_timer(void)			
{
    if(wt588_timer_cnt)
    {
        wt588_timer_cnt--;
    }
}
